const express = require('express')
var cookieParser = require('cookie-parser')
const session = require('express-session')
const mongoStore = require('connect-mongo')
//共有三种会话控制技术：cookie、session和token，
// cookie将数据存储于客户端，会自动携带到服务器，但是比较不安全，没有加密，而且会受到CSRF攻击
// session将数据存储于服务器端，只将sid通过cookie发送给客户端，sid对应的所有信息存储于服务器，所以对服务器的压力较大
//token将数据存储于客户端，对服务器压力小；而且完全加密，需要手动发送到服务器，所以不会受到CSRF攻击；对于服务器不同的服务之间也可以共享，使得增加服务节点更简单，总之就是安全、性能高、拓展性强
const app = express()

//安装中间件解析并存储session到mongo中
app.use(session({
	name: 'sid',
	secret: 'atguigu',
	saveUninitialized: false,
	resave: true,
	store: mongoStore.create({
		mongoUrl: 'mongodb://127.0.0.1:27017/bilibili'
	}),
	cookie: {
		httpOnly: true,
		sameSite: true,
		maxAge: 1000 * 60,
	}
}))
app.use(cookieParser())
app.get('/setCookie', (req, res) => {
	res.cookie('name', 'zhangsan', {
		maxAge: 60 * 1000
	})
	res.send('设置成功')
})
app.get('/removeCookie', (req, res) => {
	res.clearCookie('name')

	res.send('删除成功')
})
app.get('/getCookie', (req, res) => {
	console.log(req.cookies)
	res.send('查询成功')
})

app.get('/login', (req, res) => {
	if (req.query.username === 'admin' && req.query.password === 'admin') {
		req.session.username = 'admin'
		req.session.uid = '231r34134'
		res.send('登录成功')
	} else {
		res.send('登录失败')
	}
})
app.get('/cart', (req, res) => {
	if (req.session.username) { //中间件会通过请求头中的sid取出数据库中的username，放到请求中
		res.send('购物车列表')
	} else {
		res.send('您还未登录')
	}

})
app.listen(9000, () => console.log('开始监听'))